package com.ysw.validator.bean;

import com.ysw.validator.custom_validator.CustomLimit;
import lombok.Data;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;


/**
 * @ClassName ValidatorV1Bean
 * @Description 测试使用 validator的类
 * @Author ysw
 * @Date 2022/5/12 19:48
 *
 *
 * 注解
 *       描述
 *       支持的类型（如果这些注解放在它们不支持的类型上，那么运行时将会抛出UnexpectedTypeException异常）
 *
 *
 *       @AssertFalse
 *       检查注解的值是否为false。null值被认为验证通过。
 *       支持Boolean和boolean类型。
 *
 *
 *       @AssertTrue
 *       检查注解的值是否为true。null值被认为验证通过。
 *
 *
 *       @DecimalMax(value=, inclusive=)
 *       当inclusive=false，检查注解的值是否小于指定最大值，否则，检查该值是否小于或等于指定的最大值。参数value在内部会通过new BigDecimal(value)转换为的BigDecimal表现形式再进行比较。null值被认为校验通过。
 *       支持BigDecimal、BigInteger、CharSequence，byte 、short 、int 、long以及它们的包装类型的验证。请注意，由于舍入错误，因此不支持double和float。此外hv的实现还支持Number及其子类型，以及javax.money.MonetaryAmount类型（如果存在JSR 354 的依赖）。还支持double和float，但是可能出现比较结果不准确的情况。
 *
 *
 *       @DecimalMin(value=, inclusive=)
 *       当inclusive=false，检查注解的值是否大于指定最小值，否则，检查该值是否大于或等于指定的最小值。参数value在内部会通过new BigDecimal(value)转换为的BigDecimal表现形式再进行比较。null值被认为校验通过。
 *
 *
 *       @Digits(integer=, fraction=)
 *       检查注解的值是否是属于最多integer整数位和fraction小数位范围内的数字。null值被认为校验通过。
 *
 *
 *       @Max(value=)
 *       检查注解的值是否小于或等于指定的最大值。null值被认为校验通过。
 *       支持BigDecimal、BigInteger，byte 、short 、int 、long以及它们的包装类型的验证。请注意，由于舍入错误，不支持double和float。此外，hv的实现还支持CharSequence及其子类型（由字符序列表示的数值计算），以及Number及其子类型以及javax.money.MonetaryAmount类型（如果存在JSR 354 的依赖）。还支持double和float，但是可能出现比较结果不准确的情况。
 *
 *
 *       @Min(value=)
 *       检查注解的值是否小于或等于指定的最大值。null值被认为校验通过。
 *
 *
 *       @Email
 *       检查注解的值是否是有效的电子邮件地址。可选参数 regexp 和flags允许指定电子邮件必须匹配的附加正则表达式（包括正则表达式标志）。
 *       支持CharSequence及其子类型。
 *
 *
 *       @Future
 *       检查注解的值是否是一个将来的时间。null值被认为校验通过。
 *       支持java.util.Date, java.util.Calendar, java.time.Instant, java.time.LocalDate, java.time.LocalDateTime, java.time.LocalTime, java.time.MonthDay, java.time.OffsetDateTime, java.time.OffsetTime, java.time.Year, java.time.YearMonth, java.time.ZonedDateTime, java.time.chrono.HijrahDate, java.time.chrono.JapaneseDate, java.time.chrono.MinguoDate, java.time.chrono.ThaiBuddhistDate类型。此外，hv的实现还支持Joda Time date/time类型（如果存在Joda Time依赖），以及支持ReadablePartial 和 ReadableInstant的任何实现。
 *
 *
 *       @FutureOrPresent
 *       检查注解的值是否是当前时间或者将来时间。null值被认为校验通过。
 *
 *
 *       @Past
 *       检查注解的值是否是一个过去的时间。null值被认为校验通过。
 *
 *
 *       @PastOrPresent
 *       检查注解的值是否是当前时间或者过去时间。
 *
 *
 *       @NotBlank
 *       检查注解的值是否不为null并且必须至少包含一个非空白字符。
 *       支持CharSequence及其子类型。
 *
 *
 *       @NotEmpty
 *       检查注解的值是否不为null并且不为空。
 *       支持CharSequence及其子类型（计算字符序列的长度，即不能为""），以及Collection、Map、Array（至少包含一个元素/键值对）。
 *
 *
 *       @NotNull
 *       检查注解的值是否不为null。
 *       支持任何类型。
 *
 *
 *       @Null
 *       检查注解的值是否为null。
 *
 *
 *       @Negative
 *       检查注解的值是否是严格的负数（0不通过）。null值被认为校验通过。
 *       支持BigDecimal、BigInteger，byte 、short 、int 、long 、float、double以及它们的包装类型。此外，hv的实现还支持CharSequence及其子类型（由字符序列表示的数值计算），以及Number及其子类型以及javax.money.MonetaryAmount类型（如果存在JSR 354 的依赖）。
 *
 *
 *       @NegativeOrZero
 *       检查注解的值是否是负数或0。null值被认为校验通过。null值被认为校验通过。
 *
 *
 *       @Positive
 *       检查注解的值是否是严格的正数（0不通过）。null值被认为校验通过。
 *
 *
 *       @PositiveOrZero
 *       检查注解的值是否是正数或0。null值被认为校验通过。
 *
 *
 *       @Pattern(regex=, flags=)
 *       检查注解的值是否与给定的正则表达式匹配（regex），可以考虑给定的标记匹配项（falgs）null值被认为校验通过。
 *       支持CharSequence及其子类型。
 *
 *
 *       @Positive
 *       检查注解的值是否是严格的正数（如果是0.0则通过，其他0则不通过）。null值被认为校验通过。
 *       支持BigDecimal、BigInteger，byte 、short 、int 、long 、float、double以及它们的包装类型。此外，hv的实现还支持CharSequence及其子类型（由字符序列表示的数值计算），以及Number及其子类型以及javax.money.MonetaryAmount类型（如果存在JSR 354 的依赖）。
 *
 *
 *       @PositiveOrZero
 *       检查注解的值是否是正数或0。null值被认为校验通过。
 *
 *
 *       @Size(min=, max=)
 *       检查注解的值是否在给定的最小值（默认0）和最大值（默认Integer.MAX_VALUE）之间，包含两个端点值。null值被认为校验通过。
 *       支持CharSequence及其子类型（计算字符序列的长度），以及Collection、Map、Array（计算元素/键值对数量）。
 *
 */
@Data
public class ValidatorV1Bean {
    /**
     * 级联校验测试
     */
    @Valid()
    @NotNull(message = "级联子对象不能为null",groups = {AddGroup.class})
    @Null(message = "级联子对象一定为null",groups = {UpdateGroup.class})
    private ValidatorV2Bean validatorV2Bean;
    /**
     * 这样会级联校验子目录
     */
    /*@Valid
    private List<ValidatorV2Bean> beans;*/
    @Size(min = 1,message = "beans 中的元素不对")
    private List<ValidatorV1Bean> beans;

    @NotBlank(message = "名称不能为空",groups = {AddGroup.class})
    @NotBlank(message = "名称必须为空",groups = {UpdateGroup.class})
    private String name;

    @NotNull
    @Min(10)
    private Integer age;
    /**
     * 检查注解的值是否为false。null值被认为验证通过
     */
    @AssertFalse(message = "AssertFalse: isBoy为true")
    private Boolean isBoy;
    /**
     * 检查注解的值是否为true。null值被认为验证通过。
     */
    @AssertTrue(message = "AssertTrue: isGirl为false")
    private Boolean isGirl;
    /**
     * 当inclusive=false，检查注解的值是否小于指定最大值，
     * 否则，检查该值是否小于或等于指定的最大值。
     * 参数value在内部会通过
     * new BigDecimal(value)转换为的BigDecimal表现形式再进行比较。null值被认为校验通过。
     *
     * 支持BigDecimal、BigInteger、CharSequence，byte 、short 、int 、long以及它们的包装类型的验证。
     * 请注意，由于舍入错误，因此不支持double和float。
     */
    @DecimalMax(value ="23.1",inclusive = false,message = "DecimalMax: 没有小于等于23.1")
    private BigDecimal bigDecimalMax;

    @DecimalMin(value ="23.1",inclusive = true,message = "DecimalMax: 没有大于23.1")
    private BigDecimal bigDecimalMin;
    /**
     * 检查注解的字符串值是否是属于最多integer整数位和fraction小数位范围内的数字。null值被认为校验通过
     */
    @Digits(integer = 2,fraction = 3,message = "Digits: 位数不正确")
    private String digitsDouble;
    /**
     * 检查注解的值是否小于或等于指定的最大值。null值被认为校验通过
     * 支持BigDecimal、BigInteger，byte 、short 、int 、long以及它们的包装类型的验证。请注意，由于舍入错误，不支持double和float。
     */
    @Max(value = 100L,message = "Max: 大于了100")
    private Integer max;
    @Max(value = 100L,message = "Max: 大于了100")
    private Integer min;
    /**
     * 检查注解的值是否是一个将来的时间。null值被认为校验通过。
     * 支持java.util.Date,
     * java.util.Calendar,
     * java.time.Instant,
     * java.time.LocalDate,
     * java.time.LocalDateTime,
     * java.time.LocalTime,
     * java.time.MonthDay,
     * java.time.OffsetDateTime,
     * java.time.OffsetTime,
     * java.time.Year,
     * java.time.YearMonth,
     * java.time.ZonedDateTime,
     * java.time.chrono.HijrahDate,
     * java.time.chrono.JapaneseDate,
     * java.time.chrono.MinguoDate,
     * java.time.chrono.ThaiBuddhistDate类型。
     *
     */
    @Future(message = "不是将来的时间")  //@FutureOrPresent
    private Date birthDay;

    @Pattern(regexp = "^1[1-8]{2}a{2}$",message = "正则匹配失败")
    private String email;


    /**
     * 自定义注解处理
     */
    @NotNull
    @CustomLimit(n = 5,message = "自定义注解生效")
    private Integer customInteger;

    public interface AddGroup{

    }
    public interface UpdateGroup{

    }
}